﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Menus.Model.DB;
using Menus.Model;


using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;


namespace Menus.Model
{
    public class PlatManager
    {

        /// <summary>Plat load(int id)
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Plat load(int id)
        {
            Plat plat = Globals.menusEF.Plat.Where(p => p.ID == id).First();
            return plat;
        }

        /// <summary>add
        /// 
        /// </summary>
        /// <param name="libelle"></param>
        /// <param name="listIngredient"></param>
        /// <returns></returns>
        public Plat add(string libelle, List<string> listIngredient)
        {

            try
            {
                //on n'ajoute pas le plat si aucun nom n'est spécifié
                if (libelle.Trim() == "")
                    throw new Exception("aucun nom de plat n'est spécifié");

                //le plat existe déjà?
                Plat platConnu = Globals.menusEF.Plat.Where(p => p.Libelle == libelle).SingleOrDefault();
                if (platConnu != null)
                    throw new Exception("ce plat existe déjà");

                //nouveau plat
                Plat plat = new Plat();
                plat.Libelle = libelle;
           

                //on parcours la liste des ingrédients du nouveau plat
                foreach (string item in listIngredient)
                {
                    IngredientManager ingredientManager = new IngredientManager();

                    //si l'ingredient n'existe pas, on l'ajoute
                    if (!ingredientManager.Exists(item))
                        ingredientManager.Add(item, Globals.coutNormal);                

                    //récupération de l'ingrédient
                    IngredientManager manager = new IngredientManager();
                    var newIngredient = manager.load(item);
                
                    //ajout de l'ingredient au plat
                    plat.Ingredient.Add(newIngredient);                
                }

                //on ajoute le plat
                Globals.menusEF.Plat.Add(plat);
                Globals.menusEF.SaveChanges();
                return plat;
            }
            catch (Exception ex)
            {
                throw new Exception("Ajout impossible: "+ex.Message);                
            }
        }

        /// <summary>Update
        /// mise à jour du plat
        /// </summary>
        /// <param name="libelle"></param>
        /// <param name="listIngredient"></param>
        public void Update(int idPlat, string libelle, List<string> listIngredient)
        {
            Plat plat = Globals.menusEF.Plat.Where(p => p.ID == idPlat).First();
            plat.Libelle = libelle;
            //on supprime les ingredients du plat
            while (plat.Ingredient.Count() > 0)
            {
                var ingredient = plat.Ingredient.First();
                plat.Ingredient.Remove(ingredient);
            }
            

            //ajout des ingredients
            foreach (var item in listIngredient)
            {                
                var im = new IngredientManager();
                Ingredient ingredient;
                //l'ingregient existe t-il?
                if (!im.Exists(item))
                    //non on l'ajoute
                    ingredient = im.Add(item, Globals.coutNormal);
                else
                    //oui, on le charge
                    ingredient = im.load(item);
                                
                //on l'ajoute
                plat.Ingredient.Add(ingredient);                
            }
            

            Globals.menusEF.SaveChanges();                       
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public BindingSource GetListPlat()
        {
            var getData = Globals.menusEF.Plat.ToList();
            BindingSource source = new BindingSource();
            source.DataSource = getData;

            return source;         
        }

        /// <summary>GetCout
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public int GetCout(int id)
        {
            int cout = 0;
            var plat = Globals.menusEF.Plat.Where(p => p.ID == id).First();
            foreach(var ingredient in plat.Ingredient)
            {
                cout += ingredient.Cout;                
            }
            return cout;
        }


    }
}
